#ifndef _TEXTURE_H_
#define _TEXTURE_H_

#include <string>
#include <map>

#include "Image.h"
#include "Vector.h"
#include "Material.h"

/**
 * Classe de Texture, permet de mettre une texture sur un objet
 */
class OBJECT_API Texture : public Material{
 public:
    /**
     * Charge une image PNG en texture
     * @param path le chemin d'accès
     * @param diffuse La quantité de lumière réfléchie
     * @param reflective La quantité de lumière réfléchie pour la réflection
     * @param spec La quantité de lumière specular réfléchie
     */
    Texture(std::string path,float diffuse,float reflective,float spec); 
    ~Texture();
    /**
     * retourne le pixel à une coordonnée UV
     * @param UV la coordonnée UV
     */
    virtual Pixelf getAt(Math::Vector UV) const;
 private:
    Image* m_img; ///< l'image de la texture 
    std::string m_path; ///< le chemin d'accès

    static Image* loadTexture(std::string& path); ///< va chercher la texture path, en évitant de la recharger si elle existe déjà
    static void incRef(std::string& path);///< incrémente le compteur d'utilisation d'une texture
    static void decRef(std::string& path);///< décrémente le compteur d'utilisation d'une texture, s'il atteint zéro, on libère l'image
    static std::map<std::string,Image*> c_images; ///<les images chargées
    static std::map<std::string,int> c_refcount; ///< les compteurs des images
};

#endif // header guard
